<?php
/* vim: set expandtab sw=2 sts=2 ts=2 tw=150 nu: */

App::uses('AppController', 'Controller');

/**
 * Municipios Controller
 *
 */
class MunicipiosController extends AppController {

/**
 * Ajudantes.
 *
 * @var array
 */
  public $helpers = array('Paginator');

/**
 * Opções de paginação.
 *
 * @var array
 */
  public $paginate = array(
    'fields' => array(
      'Municipio.id',
      'Municipio.nome',
      'Municipio.estado_id',
      'Estado.nome',
      'Estado.sigla',
      'Estado.pais_id',
      'Pais.nome',
      'Pais.sigla'
    ),
    'joins' => array(
      array(
        'table'      => 'estados',
        'alias'      => 'Estado',
        'type'       => 'LEFT',
        'conditions' => array('Municipio.estado_id = Estado.id'),
      ),
      array(
        'table'      => 'paises',
        'alias'      => 'Pais',
        'type'       => 'LEFT',
        'conditions' => array('Estado.pais_id = Pais.id'),
      ),
    ),
    'order' => array(
      'Pais.nome'      => 'asc',
      'Estado.nome'    => 'asc',
      'Municipio.nome' => 'asc'
    ),
    'limit'     => 10,
    'page'      => 1,
    'recursive' => -1
  );

  public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('obterDadosParaAutoCompletar');
  }

/**
 *
 */
  public function index() {
    $this->set('municipios', $this->paginate());
  }

  /**
  *
  * Excluir município.
  * @param integer $id Identificador do município.
  * @throws MethodNotAllowedException
  * @throws NotFoundException
  */
  public function excluir($id) {
    if (!$this->request->is('delete')) {
      throw new MethodNotAllowedException();
    }

    $this->Municipio->id = $id;
    if (!$this->Municipio->exists()) {
      throw new NotFoundException("Município não encontrado.");
    }

    if ($this->RequestHandler->isAjax()) {
      $this->autoRender = false;
      $resposta = array(
        "mensagem" => "",
        "sucesso"  => false,
      );
      $this->Municipio->begin();
      if ($this->Municipio->delete()) {
        $this->Municipio->commit();
        $resposta["mensagem"] = "Município excluído com sucesso.";
        $resposta["sucesso"]  = true;
      } else {
        $this->Municipio->rollback();
        $resposta["mensagem"] = "Não foi possível excluir o município.";
      }
      echo json_encode($resposta);
    } else {
      throw new BadRequestException();
    }
  }

  private function __formatarDados(& $valor, $chave) {
    $valor = $valor[0];
    return true;
  }

  public function obterDadosParaAutoCompletar() {
    if (!$this->request->is('get')) {
      throw new MethodNotAllowedException();
    }

    if ($this->RequestHandler->isAjax()) {
      $this->autoRender = false;
      $termo = $this->params->query["term"];
      $dados = $this->Municipio->query(
          "SELECT M.id AS id,
                  M.nome || ', ' || E.sigla || ' - ' || P.sigla AS label
             FROM municipios M
        LEFT JOIN estados E ON (M.estado_id = E.id)
        LEFT JOIN paises P ON (E.pais_id = P.id)
            WHERE M.nome ILIKE '%{$termo}%'
         ORDER BY P.sigla ASC,
                  E.sigla ASC,
                  M.nome ASC"
      );
      array_walk($dados, array($this, "__formatarDados"));
      echo json_encode($dados);
    } else {
      throw new BadRequestException();
    }
  }

}
